home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-SIG: World of Games
/
PC-SIG World of Games (CDRM1080710) (1993).iso
/
445
/
CHASE.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1980-01-01
|
11KB
|
372 lines
PROGRAM CHASE;
{ Version 2.01 - 11/03/84 - Mike Watkins }
CONST MAN = 'O'; {SYMBOL FOR THE MAN}
EDGE = '|'; {SYMBOL FOR THE FENCE}
OBST = '*'; {SYMBOL FOR AN OBSTRUCTION}
ROBOT = 'R'; {SYMBOL FOR A ROBOT}
BLANK = ' '; {AN ASCII BLANK}
DROB = 3; {STARTING NO OF ROBOTS}
ROBMAX = 20; {MAX NO OF ROBOTS ALLOWED}
XMAX = 39; {MAX HORIZONTAL FIELD DIMENSION}
YMAX = 14; {MAX VERTICAL FIELD DIMENSION}
TOP = 2; {SPACE ABOVE FIELD}
SIDE = 5; {SPACE TO LEFT OF FIELD}
Size = 80; { define your console screen size here }
type
Line = string[Size]; { total line length }
VAR FIELD : PACKED ARRAY[0..XMAX,0..YMAX] OF CHAR;
AGAIN,PLAY : BOOLEAN;
WIN : BOOLEAN;
MI,MJ : INTEGER; {COORDINATES OF THE MAN}
R : INTEGER; {NUMBER OF ROBOTS LEFT}
RI,RJ : ARRAY[1..ROBMAX] OF INTEGER; {ROBOT COORDINATES}
RNUM : REAL;
DIFF : INTEGER; {DIFFICULTY}
IDIFF : 0..10; {INITIAL DIFFICULTY}
GAMENU : INTEGER; {GAME NUMBER}
M : CHAR;
NROB : INTEGER; {NUMBER OF ROBOTS}
WINS : INTEGER; {NUMBER OF GAMES WON}
GOODCHAR : SET OF CHAR; {GOOD CHARACTERS}
MOVES : INTEGER; {COUNT OF MOVES}
CRASH : INTEGER; {NO OF ROBOTS "CRASHED"}
I : integer;
FUNCTION RND(LO,HI:INTEGER):INTEGER; {RANDOM NUMBER GENERATOR}
VAR Q :REAL;
I :INTEGER;
BEGIN
REPEAT
RNUM:=RNUM*21.182813+31.415917;
RNUM:=RNUM-TRUNC(RNUM);
I:=TRUNC(RNUM*HI);
UNTIL I>LO;
RND:=I;
END;
PROCEDURE DOMOVE(COL,ROW:INTEGER;SYMBOL:CHAR); {DISPLAY SYMBOL AT I,J ON FIELD}
BEGIN
GOTOXY(COL+1,ROW+1); {POSITION CURSOR}
WRITE(SYMBOL)
END; {END OF DOMOVE PROCEDURE}
{ These next two procedures allow centering of lines based on your console
screen size }
procedure Center (L:Line); { centers text without a cr & lf }
begin
for I := 1 to (Size - Length(L)) div 2 do write (' ');
write(L);
end;
procedure Centerln (L:Line); { centers text with a cr & lf}
begin
for I := 1 to (Size - Length(L)) div 2 do write (' ');
writeln(L);
end;
PROCEDURE INSTRUCTIONS; {DISPLAY INSTRUCTIONS}
VAR M:CHAR;
BEGIN
ClrScr;
Centerln ('WELCOME TO THE WONDERFUL, EXCITING, GAME OF CHASE!');
writeln;Center ('Would you like instructions (Y/N): ');
READ(Kbd,M);write(M);
M:=UPCASE(M);
IF M='Y' THEN
BEGIN
WRITELN;WRITELN;
Centerln ('HERE ARE SOME INSTRUCTIONS:');writeln;
Centerln ('You, "O",are in a HIGH VOLTAGE maze.');
Centerln ('The ROBOT computers, "R", are trying to destroy you.');
Centerln ('To win, you must destroy the computers.');
Centerln ('This is done by running them into fence posts, "*",');
Centerln ('or by running them into each other.');
Centerln ('The diagram below the maze shows how you can move,');
Centerln ('the ROBOTS will try to follow you.');
Centerln ('There are 3 ROBOTS to start for a BEGINNER.');
Centerln ('The number will increase as you win games !');
WRITELN;
Centerln ('GOOD LUCK!!!!!')
END;
END; {END OF INSTRUCTIONS}
PROCEDURE STARTGAME;
VAR SK: CHAR;
BEGIN
WRITELN;WRITELN;WRITELN;
Center('Enter a number followed by RETURN: ');READLN(RNUM);
IF RNUM=0 THEN RNUM:=12.345;
WHILE RNUM > 200 DO RNUM:=RNUM-200;
ClrScr;
Centerln ('HOW GOOD A PLAYER ARE YOU ?');
WRITELN;
Centerln ('Beginner - B');
Centerln ('Intermediate - I');
Centerln ('Expert - E');
Centerln ('Old Pro - P');
WRITELN;
Center ('Type in your skill: ');
READ (Kbd,SK);write (SK);
SK:=UPCASE(SK);
WRITELN;
WHILE NOT (SK IN ['B','I','E','P']) DO
BEGIN
writeln;Center ('What was that again please ? ');
READ (Kbd,SK);write (SK);
SK:=UPCASE(SK);
WRITELN
END;
CASE SK OF
'B': IDIFF:=0;
'I': IDIFF:=1;
'E': IDIFF:=3;
'P': IDIFF:=5;
END;
END;
PROCEDURE INITIALIZE; {SET UP BLANK FIELD SURROUNDED BY FENCE}
VAR I,J:INTEGER;
BEGIN
FOR I:=0 TO XMAX DO
BEGIN
FOR J:=0 TO YMAX DO
IF((I=0) OR (I=XMAX) OR (J=0) OR (J=YMAX)) THEN FIELD[I,J]:=EDGE
ELSE FIELD[I,J]:=BLANK
END;
END; {END OF INITIALIZE}
PROCEDURE INNERFIELD; {SET UP MAN, ROBOTS AND OBSTRUCTIONS}
VAR I,J,L,POSTS:INTEGER;
BEGIN
MI:=RND(0,XMAX); MJ:=RND(0,YMAX); {LOCATE MAN AT ANY RANDOM POSITION}
FIELD[MI,MJ]:=MAN;
R:=NROB;
FOR L:=1 TO R DO {NOW DO R ROBOTS}
BEGIN
REPEAT
I:=RND(0,XMAX);J:=RND(0,YMAX);
UNTIL FIELD[I,J]=BLANK;
FIELD[I,J]:=ROBOT;
RI[L]:=I;
RJ[L]:=J
END;
POSTS:=RND(25,35); {NOW SET UP 25 TO 35 POSTS}
FOR L:=1 TO POSTS DO
BEGIN
REPEAT
IF DIFF>3 THEN
BEGIN
I:=RND(0,XMAX);
J:=RND(0,YMAX)
END ELSE
BEGIN
I:=RND(1,XMAX-1);
J:=RND(1,YMAX-1)
END;
UNTIL FIELD[I,J]=BLANK;
FIELD[I,J]:=OBST
END;
END; {END OF INNERFIELD}
PROCEDURE MAP; {DISPLAY PLAYING FIELD}
VAR I,J:INTEGER;
BEGIN
ClrScr;
WRITELN('GAME DIFF ROBOTS WINS MOVE':79);
WRITE(' ':44,GAMENU:3,DIFF:5,R:8,WINS:10,MOVES:8);
GOTOXY(1,1);
FOR J:=0 TO YMAX DO
BEGIN
FOR I:=0 TO XMAX DO WRITE(FIELD[I,J]);
WRITELN
END;
WRITELN;
WRITELN('1 2 3 Q = Quit');
WRITELN('4 X 6 5 = No Move');
WRITE('7 8 9 MOVE => ');
END; {END OF MAP}
PROCEDURE MOVE; {ENTER YOUR MOVE FROM KEYBOARD}
VAR M : INTEGER;
C : CHAR;
BAD : BOOLEAN;
BEGIN
BAD:=FALSE;
REPEAT
WRITE(' ',CHR(8));
READ (Kbd,C);write (C);
C:=UPCASE(C);
IF NOT (C IN GOODCHAR) THEN
BEGIN
GOTOXY(5,22);
BAD:=TRUE;
WRITE('Bad move, please try again! ':33,CHR(7))
END;
UNTIL (C IN GOODCHAR);
IF BAD THEN
BEGIN
GOTOXY(5,22);
WRITE(' ':40);
GOTOXY(11,23);
END;
IF C='Q' THEN
BEGIN
PLAY:=FALSE;
WIN:=FALSE
END;
M:=ORD(C)-48;
FIELD[MI,MJ]:=BLANK;
DOMOVE(MI,MJ,BLANK);
CASE M OF
7: BEGIN MI:=MI-1; MJ:=MJ-1 END;
8: MJ:=MJ-1;
9: BEGIN MI:=MI+1; MJ:=MJ-1 END;
4: MI:=MI-1;
5: ;
6: MI:=MI+1;
1: BEGIN MI:=MI-1; MJ:=MJ+1 END;
2: MJ:=MJ+1;
3: BEGIN MI:=MI+1; MJ:=MJ+1 END
END;
MOVES:=MOVES+1;
IF FIELD[MI,MJ] = BLANK THEN
BEGIN
DOMOVE(MI,MJ,MAN);
FIELD[MI,MJ]:=MAN
END ELSE
BEGIN
IF FIELD[MI,MJ] = EDGE THEN
BEGIN
WIN:=FALSE;
PLAY:=FALSE;
WRITELN('OUCH, YOU GOT ELECTROCUTED!')
END ELSE
BEGIN
IF FIELD[MI,MJ] = ROBOT THEN
WRITELN('THWACK! YOU RAN INTO A ROBOT (TURKEY!)') ELSE
WRITELN('ZZAP! YOU RAN INTO AN ELECTIFIED POST');
WIN:=FALSE;
PLAY:=FALSE
END;
END;
END; {END OF MOVE PROCEDURE}
PROCEDURE ROBOTMOVE; {COMPUTE MOVE FOR R OR FEWER ROBOTS}
VAR M,L,I,J:INTEGER;
BEGIN
FOR L:=1 TO NROB DO
BEGIN
IF((RI[L]<>0) AND (WIN)) THEN
BEGIN
FIELD[RI[L],RJ[L]]:=BLANK;
DOMOVE(RI[L],RJ[L],BLANK);
IF MI>RI[L] THEN RI[L]:=RI[L]+1;
IF MI<RI[L] THEN RI[L]:=RI[L]-1;
IF MJ>RJ[L] THEN RJ[L]:=RJ[L]+1;
IF MJ<RJ[L] THEN RJ[L]:=RJ[L]-1;
I:=RI[L];J:=RJ[L];
IF FIELD[I,J]=BLANK THEN
BEGIN
FIELD[RI[L],RJ[L]]:=ROBOT;
DOMOVE(I,J,ROBOT)
END
ELSE
BEGIN
IF ((FIELD[I,J]=OBST) OR (FIELD[I,J]=ROBOT)) THEN
BEGIN
GOTOXY(XMAX+13,CRASH+4);
CRASH:=CRASH+1;
WRITELN('CRASH!! YOU GOT ONE!!');
R:=R-1;
GOTOXY(54,2); {CHANGE NO OF ROBOTS}
WRITE(R:8);
RI[L]:=0;
IF R=0 THEN
BEGIN
GOTOXY(XMAX+17,CRASH+4);
WRITELN('GOOD WORK!');
GOTOXY(XMAX+9,CRASH+5);
WRITELN('YOU HAVE DESTROYED THEM ALL!!');
WIN:=TRUE;
PLAY:=FALSE
END;
END;
END;
IF FIELD[RI[L],RJ[L]]=FIELD[MI,MJ] THEN
BEGIN
WRITELN('ZAP! A COMPUTER GOT YOU!');
WIN:=FALSE;
PLAY:=FALSE
END;
END;
END;
END; {END OF ROBOTMOVE PROCEDURE}
BEGIN {START OF MAIN PROGRAM}
GOODCHAR:=['1'..'9','Q'];
GAMENU:=1;
WINS:=0;
AGAIN:=TRUE;
PLAY:=TRUE; {INITIALIZE QUIT}
INSTRUCTIONS; {DISPLAY INSTRUCTIONS}
STARTGAME; {INPUT STARTING POSITION AND SKILL LEVEL}
DIFF:=IDIFF; {INITIAL DIFFICULTY LEVEL}
NROB:=DROB+DIFF*2; {INITIAL NUMBER OF ROBOTS}
WHILE AGAIN DO
BEGIN
MOVES:=1;WIN:=TRUE;CRASH:=0;
INITIALIZE; {CLEARS FIELD[X,Y]}
INNERFIELD; {SETS UP PLAYING FIELD}
WHILE PLAY DO
BEGIN
IF MOVES=1 THEN MAP ELSE
BEGIN
GOTOXY(71,2);
WRITELN(MOVES:8);
DOMOVE(30,18,BLANK) {INPUT NEXT MOVE}
END;
MOVE; {LETS YOU MOVE}
IF(PLAY) THEN ROBOTMOVE {MOVES THE ROBOTS}
END;
GOTOXY(1,22);
Center ('Would you like to play again? (Y/N) ');
READ(Kbd,M);write (M);
M:=UPCASE(M);
IF M='N' THEN AGAIN:=FALSE ELSE
BEGIN
PLAY:=TRUE;
GAMENU:=GAMENU+1;
IF WIN THEN
BEGIN
WINS:=WINS+1;
IF WINS>2 THEN DIFF:=IDIFF+1;
IF WINS>5 THEN DIFF:=IDIFF+2;
IF WINS>8 THEN DIFF:=IDIFF+3;
IF WINS>11 THEN DIFF:=IDIFF+4;
IF WINS>15 THEN DIFF:=IDIFF+6;
IF WINS>20 THEN DIFF:=IDIFF+8;
IF WINS>30 THEN DIFF:=IDIFF+12;
NROB:=DROB+2*DIFF
END;
END;
END;
END.
0 THEN DIFF:=IDIFF+8;
IF WINS>30 THEN DIFF:=IDIFF+12;
NROB:=DROB+2*D